Thread Creation, Synchronization এবং Mutex Handling

Computer Programming - সি স্ট্যান্ডার্ড লাইব্রেরি রেফারেন্স (C Standard Library Reference) Multithreading এবং Concurrency (মাল্টিথ্রেডিং এবং কনকারেন্সি) |
249
249

Thread Creation, Synchronization এবং Mutex Handling

সি প্রোগ্রামিং ভাষায় থ্রেড ব্যবহার এবং মিউটেক্স (mutex) হ্যান্ডলিং সাধারণত POSIX Threads (pthreads) লাইব্রেরি ব্যবহার করে করা হয়। থ্রেড তৈরি, সিঙ্ক্রোনাইজেশন এবং মিউটেক্স ব্যবহৃত হয় বহুসংখ্যক থ্রেডের মধ্যে সঠিকভাবে কাজ করতে এবং মেমোরি রেস কন্ডিশন (race condition) এড়াতে। নিচে থ্রেড তৈরি, সিঙ্ক্রোনাইজেশন এবং মিউটেক্স হ্যান্ডলিংয়ের বিস্তারিত আলোচনা করা হলো।


1. Thread Creation

থ্রেড হলো একটি প্রক্রিয়ার মধ্যে কাজ করার স্বতন্ত্র একক। থ্রেড তৈরি করতে pthread_create() ফাংশনটি ব্যবহার করা হয়।

সিঙ্কট্যাক্স:

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                   void *(*start_routine)(void *), void *arg);
  • thread: নতুন থ্রেডের জন্য একটি পয়েন্টার।
  • attr: থ্রেডের অ্যাট্রিবিউট সেটিংস (সাধারণত NULL পাঠানো হয়)।
  • start_routine: থ্রেডের জন্য শুরু হওয়া ফাংশন।
  • arg: শুরু হওয়া ফাংশনে পাস করা আর্গুমেন্ট (যদি প্রয়োজন হয়)।

উদাহরণ:

#include <stdio.h>
#include <pthread.h>

void *hello_world(void *arg) {
    printf("Hello from thread!\n");
    return NULL;
}

int main() {
    pthread_t thread;  // থ্রেড ডিক্লেয়ারেশন

    // থ্রেড তৈরি
    if (pthread_create(&thread, NULL, hello_world, NULL) != 0) {
        perror("Thread creation failed");
        return 1;
    }

    // থ্রেডের শেষ হওয়া পর্যন্ত অপেক্ষা করা
    pthread_join(thread, NULL);

    printf("Thread finished executing.\n");
    return 0;
}

এখানে pthread_create() ফাংশনটি একটি নতুন থ্রেড তৈরি করেছে, যা hello_world() ফাংশনটি চালাবে। pthread_join() ফাংশনটি থ্রেডটি শেষ হওয়া পর্যন্ত অপেক্ষা করে।


2. Thread Synchronization

থ্রেড সিঙ্ক্রোনাইজেশন নিশ্চিত করে যে একাধিক থ্রেডের মধ্যে কোনও ডেটা কনফ্লিক্ট বা রেস কন্ডিশন (যখন একাধিক থ্রেড একই ডেটা এক্সেস করে) না ঘটে। সিঙ্ক্রোনাইজেশন বিভিন্ন মেকানিজমের মাধ্যমে করা হয়, যেমন মিউটেক্স (mutexes), কন্ডিশন ভেরিয়েবল, সেমাফোর ইত্যাদি।

সিঙ্ক্রোনাইজেশন এর উদাহরণ:

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex;  // মিউটেক্স ডিক্লেয়ারেশন

void *increment(void *arg) {
    pthread_mutex_lock(&mutex);  // মিউটেক্স লক করা

    // critical section
    printf("Thread is executing\n");

    pthread_mutex_unlock(&mutex);  // মিউটেক্স আনলক করা
    return NULL;
}

int main() {
    pthread_t threads[5];
    
    // মিউটেক্স ইনিশিয়ালাইজ করা
    pthread_mutex_init(&mutex, NULL);

    // থ্রেড তৈরি করা
    for (int i = 0; i < 5; i++) {
        pthread_create(&threads[i], NULL, increment, NULL);
    }

    // থ্রেডের শেষে যাওয়া
    for (int i = 0; i < 5; i++) {
        pthread_join(threads[i], NULL);
    }

    // মিউটেক্স ডেস্ট্রয় করা
    pthread_mutex_destroy(&mutex);

    printf("All threads finished.\n");
    return 0;
}

এখানে, pthread_mutex_lock() এবং pthread_mutex_unlock() ফাংশনগুলো ব্যবহার করে মিউটেক্স সিঙ্ক্রোনাইজেশন পরিচালনা করা হয়েছে।


3. Mutex Handling

মিউটেক্স (mutual exclusion) একটি সিঙ্ক্রোনাইজেশন প্রক্রিয়া যা একাধিক থ্রেডের মধ্যে একে অপরের কাছে একসাথে ডেটা অ্যাক্সেসে বাধা দেয়। এটি একটি লকিং মেকানিজম, যা নিশ্চিত করে যে এক সময়ে শুধুমাত্র একটি থ্রেড মেমোরি বা রিসোর্স অ্যাক্সেস করতে পারে।

সিঙ্কট্যাক্স:

#include <pthread.h>

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
  • pthread_mutex_init(): মিউটেক্স ইনিশিয়ালাইজ করে।
  • pthread_mutex_lock(): মিউটেক্সে লক করে, যদি অন্য কোনো থ্রেড মিউটেক্সে লক করে থাকে, তাহলে এটি অপেক্ষা করবে।
  • pthread_mutex_unlock(): মিউটেক্স আনলক করে, অন্য থ্রেডের জন্য লক উপলব্ধ করে।
  • pthread_mutex_destroy(): মিউটেক্স ধ্বংস করে।

উদাহরণ: মিউটেক্সের মাধ্যমে দুটি থ্রেডের মধ্যে সিঙ্ক্রোনাইজেশন

#include <stdio.h>
#include <pthread.h>

pthread_mutex_t mutex;
int counter = 0;

void *increment(void *arg) {
    pthread_mutex_lock(&mutex);  // মিউটেক্স লক করা
    counter++;
    printf("Counter value: %d\n", counter);
    pthread_mutex_unlock(&mutex);  // মিউটেক্স আনলক করা
    return NULL;
}

int main() {
    pthread_t threads[5];
    
    pthread_mutex_init(&mutex, NULL);  // মিউটেক্স ইনিশিয়ালাইজ

    // থ্রেড তৈরি
    for (int i = 0; i < 5; i++) {
        pthread_create(&threads[i], NULL, increment, NULL);
    }

    // থ্রেডের শেষ হওয়া পর্যন্ত অপেক্ষা করা
    for (int i = 0; i < 5; i++) {
        pthread_join(threads[i], NULL);
    }

    pthread_mutex_destroy(&mutex);  // মিউটেক্স ধ্বংস

    return 0;
}

এখানে, counter ভেরিয়েবলটি একাধিক থ্রেড দ্বারা এক্সেস করা হচ্ছে, কিন্তু মিউটেক্স pthread_mutex_lock() এবং pthread_mutex_unlock() দ্বারা সিঙ্ক্রোনাইজ করা হয়েছে, যাতে একাধিক থ্রেড একসাথে এই ভেরিয়েবলটি পরিবর্তন করতে না পারে। এর ফলে ডেটার সঠিকতা বজায় থাকে।


সারসংক্ষেপ:

  • থ্রেড তৈরি: pthread_create() ব্যবহার করে থ্রেড তৈরি করা হয়।
  • সিঙ্ক্রোনাইজেশন: থ্রেডের মধ্যে সঠিক ডেটা ম্যানিপুলেশন নিশ্চিত করতে সিঙ্ক্রোনাইজেশন ব্যবহৃত হয়। এটি মিউটেক্স, সেমাফোর, বা কন্ডিশন ভেরিয়েবল দ্বারা করা হয়।
  • মিউটেক্স: একাধিক থ্রেডের মধ্যে ডেটা এক্সেস লক এবং আনলক করতে pthread_mutex_lock() এবং pthread_mutex_unlock() ব্যবহৃত হয়। pthread_mutex_init() দ্বারা মিউটেক্স ইনিশিয়ালাইজ করা হয় এবং pthread_mutex_destroy() দ্বারা মিউটেক্স ধ্বংস করা হয়।

থ্রেড ব্যবস্থাপনা এবং সিঙ্ক্রোনাইজেশন নিশ্চিত করতে এই কনসেপ্টগুলি অত্যন্ত গুরুত্বপূর্ণ, বিশেষত মাল্টিথ্রেডেড প্রোগ্রামে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion